package com.mycode.composite09;

import com.mycode.composite09.resolve.AbstractFile;
import com.mycode.composite09.resolve.ImageFile;
import com.mycode.composite09.resolve.VideoFile;

/**
 * 组合模式：组合多个对象形成树形结构以表示具有“整体-部分”关系的层级结构。组合模式对单个对象（即叶子对象）和组合对象（即容器对象）的适用具有一致性
 * 主要优点：
 *     1、组合模式可以清楚地定义分层次的复杂对象，让客户端忽略层次的差异，方便对整个层次结构进行控制
 *     2、客户端可以一致地适用一个组合结构或其中单个对象，不必关系处理的是单个对象还是整个组合结构，简化了客户端代码
 *     3、组合模式中增加新的容器组件和叶子组件都很方便，无需对现有类库进行任何修改，符合开闭原则
 *     4、组合模式为树形结构的面向对象实现提供了一种灵活的解决方案，通过叶子对象和容器对象的递归组合，可以形成复杂的属性结构，但控制却很简单
 *
 * 主要缺点：
 *     1、在增加新组件时很难对容器中的组件类型进行限制。有时候希望一个容器中只能有某些特定类型的对象，适用组合模式不能依赖类型系统来施加约束，想实现必须在运行时进行类型检查来实现
 *
 * 适用场景：
 *     1、在具有整体和部分的层级结构中，希望通过一种方式忽略整体与部分的差异，客户端可以一致性的对待
 *     2、在一个使用面向对象语言开发的系统中需要处理一个树形结构
 *     3、在一个系统中能够分离出叶子对象和容器对象，而且它们的类型不固定，需要增加一些新的类型
 */
public class Bootstrap {

    public static void main(String[] args) {
        AbstractFile file = new ImageFile("张三.img");
        file.test(null);
        AbstractFile file1 = new VideoFile("lisi.mp4");
        file1.test(null);
    }
}
